package com.tarena.proxy.demo02;

import com.tarena.proxy.demo01.男人;
import com.tarena.proxy.demo01.范传奇;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Client02 {
    public static void main(String[] args) {
        final 范传奇 target=new 范传奇();
        System.out.println(target.getClass().getName());
        男人 proxy = (男人) getProxy(target);
        proxy.追女孩("王翠花");
        proxy.吃("西餐");
        proxy.睡("石头上");
        System.out.println(proxy.getClass().getName());
    }

    /**
     * 静态方法 获取一个target的代理对象
     * @param target 被代理的对象
     * @return
     */
    public static Object getProxy(final Object target){
        Object proxy= Proxy.newProxyInstance
                (target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
                    //invoke 方法是 jdk代理的核心方法 代理逻辑编写位置
                    //method 就是目标对象执行的方法反射对象
                    //args 就是目标对象执行的方法的参数数据
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("当前目标对象执行的方法:"+method.getName());
                        System.out.println("当前目标对象执行方法的参数:"+args[0].toString());
                        //能拿到所有被代理者的方法执行信息
                        //本职工作 执行目标方法 如果目标方法有返回值 invoke也要返回
                        Object invoke = method.invoke(target,args);
                        return invoke;
                    }
            });
        return proxy;
    }
}
